home *** CD-ROM | disk | FTP | other *** search
/ Internet Publisher's Toolbox 2.0 / Internet Publisher's Toolbox.iso / internet / ntserver / wtsource / wmessage.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-16  |  3.6 KB  |  144 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.    
  4.    3.26.90
  5. */
  6.  
  7. /* Copyright (c) CNIDR (see ../COPYRIGHT) */
  8.  
  9.  
  10. /* This file is for reading and writing the wais packet header.
  11.  * Morris@think.com
  12.  */
  13.  
  14. #ifndef lint
  15. static char *RCSid = "$Header: /usr/users/freewais/FreeWAIS-0.1/ir/wmessage.c,v 1.1 1993/02/16 15:05:35 freewais Exp $";
  16. #endif
  17.  
  18. /* Change log:
  19.  * $Log: wmessage.c,v $
  20.  * Revision 1.1  1993/02/16  15:05:35  freewais
  21.  * Initial revision
  22.  *
  23.  * Revision 1.2  92/02/12  13:56:35  jonathan
  24.  * Added "$Log" so RCS will put the log message in the header
  25.  * 
  26.  * 
  27. */
  28.  
  29. /* to do:
  30.  *  add check sum
  31.  *  what do you do when checksum is wrong?
  32.  */
  33.  
  34. #include <string.h>
  35. #include "wmessage.h"
  36. #include "ustubs.h"
  37. #include "cutil.h"
  38.  
  39. /*---------------------------------------------------------------------*/
  40.  
  41. void 
  42. readWAISPacketHeader(msgBuffer,header_struct)
  43. char* msgBuffer;
  44. WAISMessage *header_struct;
  45. {
  46.   /* msgBuffer is a string containing at least HEADER_LENGTH bytes. */
  47.             
  48.   memmove(header_struct->msg_len,msgBuffer,(size_t)10); 
  49.   header_struct->msg_type = char_downcase((unsigned long)msgBuffer[10]);
  50.   header_struct->hdr_vers = char_downcase((unsigned long)msgBuffer[11]);
  51.   memmove(header_struct->server,(void*)(msgBuffer + 12),(size_t)10);
  52.   header_struct->compression = char_downcase((unsigned long)msgBuffer[22]);
  53.   header_struct->encoding = char_downcase((unsigned long)msgBuffer[23]);
  54.   header_struct->msg_checksum = char_downcase((unsigned long)msgBuffer[24]);
  55. }
  56.  
  57. /*---------------------------------------------------------------------*/
  58.  
  59. long
  60. getWAISPacketLength(header)
  61. WAISMessage* header;
  62. /* interpret the length field, this is necessary since the lenght in the
  63.    message is not null terminated, so atol() may get confused.
  64.  */
  65.   char lenBuf[11];
  66.   memmove(lenBuf,header->msg_len,(size_t)10);
  67.   lenBuf[10] = '\0';
  68.   return(atol(lenBuf));
  69. }
  70.  
  71. /*---------------------------------------------------------------------*/
  72.  
  73. #ifdef NOTUSEDYET
  74.  
  75. static char checkSum _AP((char* string,long len));
  76.  
  77. static char
  78. checkSum(string,len)
  79. char* string;
  80. long len;
  81. /* XXX the problem with this routine is that it can generate 
  82.    non-ascii values.  Since these values are not being hexized,
  83.    they can (and will) hang up some communication channels.
  84.    */
  85. {
  86.   register long i;
  87.   register char chSum = '\0';
  88.       
  89.   for (i = 0; i < len; i++)
  90.     chSum = chSum ^ string[i];
  91.         
  92.   return(chSum);
  93. }    
  94. #endif /* def NOTUSEDYET */
  95.  
  96. /* this modifies the header argument.  See wais-message.h for the different
  97.  * options for the arguments.
  98.  */
  99.  
  100. void
  101. writeWAISPacketHeader(header,
  102.               dataLen,
  103.               type,
  104.               server,
  105.               compression,
  106.               encoding,
  107.               version)
  108. char* header;
  109. long dataLen;
  110. long type;
  111. char* server;
  112. long compression;
  113. long encoding;
  114. long version;
  115. /* Puts together the new wais before-the-z39-packet header. */
  116. {
  117.   char lengthBuf[11];
  118.   char serverBuf[11];
  119.  
  120.   long serverLen = strlen(server);
  121.   if (serverLen > 10)
  122.     serverLen = 10;
  123.  
  124.   sprintf(lengthBuf, "%010ld", dataLen);  
  125.   strncpy(header,lengthBuf,10);
  126.  
  127.   header[10] = type & 0xFF; 
  128.   header[11] = version & 0xFF;
  129.  
  130.   strncpy(serverBuf,server,serverLen);       
  131.   strncpy((char*)(header + 12),serverBuf,serverLen);
  132.  
  133.   header[22] = compression & 0xFF;    
  134.   header[23] = encoding & 0xFF;    
  135.   header[24] = '0'; /* checkSum(header + HEADER_LENGTH,dataLen);   XXX the result must be ascii */    
  136. }              
  137.               
  138. /*---------------------------------------------------------------------*/
  139.  
  140.  
  141.  
  142.  
  143.